/* 
* @path: src/hello-vue-router/install.js
* @Description:插件安装方法install
*/
import View from './components/view'
import Link from './components/link'

export let _Vue
// 在这里导出vue是因为在VueRouter类中会使用vue构造函数的api，如果直接引入vue构造函数的话打包提交过大，正好这里vue构造函数作为入参，可以直接暴露出去

export function install(Vue) {
    // 检查是否已经注册过，是否已拿到构造函数
    if (install.installed && _Vue === Vue) return
    install.installed = true
    _Vue = Vue

    // 全局注册混入，每个vue实例都会被影响
    Vue.mixin({
        // Vue创建前的钩子函数，此时$options已挂载完成
        beforeCreate() {
            // 通过判断组件实例this.$options有无router属性来判断是否为根实例
            // 只有根实例初始化时我们挂载了VueRouter实例router（main.js中New Vue({router})时
            if (this.$options.router) {
                this._routerRoot = this
                // 在 Vue 根实例添加_router属性（VueRouter 实例）
                this._router = this.$options.router
                this._route = {}
            } else {
                // 为每个组件实例定义_routerRoot,回溯查找_routerRoot
                this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
            }
        }
    })

    Object.defineProperty(Vue.prototype, "$router", {
        get() {
            return this._routerRoot._router
        }
    })

    Object.defineProperty(Vue.prototype, "$route", {
        get() {
            return this._routerRoot._route
        }
    })

    // 注册全局组件
    Vue.component('RouterView', View)
    Vue.component('RouterLink', Link)

}
